package com.yuanzi.base.util;

import java.math.BigDecimal;

/**
 * BigDecimal工具类<br>
 * scale:要保留的位数<br>
 * roundingMode：<br>
 * BigDecimal.ROUND_DOWN 直接删除多余的小数位，如2.35会变成2.3<br>
 * BigDecimal.ROUND_UP 进位处理，2.35变成2.4<br>
 * BigDecimal.ROUND_HALF_UP 四舍五入，2.35变成2.4<br>
 * BigDecimal.ROUND_HALF_DOWN 四舍五入，2.35变成2.3，如果是5则向下舍<br>
 * @author chengshx
 * @date 2017年9月13日
 */
public class BigDecimalUtils {

	/**
	 * 四舍五入格式化<br>
	 * 也可以将空值初始化
	 * @author chengshx
	 * @param num
	 * @param scale 保留的小数位数
	 * @return
	 */
	public static BigDecimal formatDecimal(BigDecimal num, int scale) {
		if(num == null) {
			num = new BigDecimal(0);
		}
		return num.setScale(scale, BigDecimal.ROUND_HALF_UP);
	}
	
	/**
	 * 根据roundingMode保留scale位
	 * @author cui
	 * @param num
	 * @param scale
	 * @param roundingMode
	 * @return
	 */
	public static BigDecimal formatDecimal(BigDecimal num, int scale, Integer roundingMode) {
		if(num == null) {
			num = new BigDecimal(0);
		}
		return num.setScale(scale, roundingMode);
	}
	
	/**
	 * 四舍五入保留两位小数<br>
	 * @author chengshx
	 * @date 2017年9月15日
	 *
	 * @param num
	 * @return
	 */
	public static BigDecimal formatDecimal(BigDecimal num) {
		return formatDecimal(num, 2);
	}
	
	/**
	 * 四舍五入保留两位小数<br>
	 * @author chengshx
	 * @date 2017年9月15日
	 *
	 * @param num
	 * @return
	 */
	public static BigDecimal formatDecimal(Double num) {
		if(num == null) {
			num = 0.0;
		}
		return formatDecimal(new BigDecimal(num), 2);
	}
	
	/**
	 * 乘法四舍五入保留两位小数
	 * @author chengshx
	 * @date 2017年9月15日
	 *
	 * @param num1
	 * @param num2
	 * @return
	 */
	public static BigDecimal multiply(BigDecimal num1, BigDecimal num2) {
		if(num1 == null) {
			num1 = new BigDecimal(0);
		}
		if(num2 == null) {
			num2 = new BigDecimal(0);
		}
		return formatDecimal(num1.multiply(num2), 2);
	}
	
	/**
	 * 乘法四舍五入保留scale小数
	 * @author chengshx
	 * @date 2017年9月15日
	 *
	 * @param num1
	 * @param num2
	 * @return
	 */
	public static BigDecimal multiply(BigDecimal num1, BigDecimal num2, Integer scale) {
		if(num1 == null) {
			num1 = new BigDecimal(0);
		}
		if(num2 == null) {
			num2 = new BigDecimal(0);
		}
		return formatDecimal(num1.multiply(num2), scale);
	}
	
	/**
	 * 乘法根据roundingMode保留scale位小
	 * @author cui
	 * @param num1
	 * @param num2
	 * @return
	 */
	public static BigDecimal multiply(BigDecimal num1, BigDecimal num2, Integer scale, Integer roundingMode) {
		if(num1 == null) {
			num1 = new BigDecimal(0);
		}
		if(num2 == null) {
			num2 = new BigDecimal(0);
		}
		return formatDecimal(num1.multiply(num2), scale, roundingMode);
	}
	
	/**
	 * 除法四舍五入保留两位小数
	 * @author chengshx
	 * @date 2017年9月15日
	 *
	 * @param num1 被除数
	 * @param num2 除数
	 * @return
	 */
	public static BigDecimal divide(BigDecimal num1, BigDecimal num2) {
		if(num1 == null) {
			num1 = new BigDecimal(0);
		}
		if(num2 == null) {
			num2 = new BigDecimal(0);
		}
		return num1.divide(num2, 2, BigDecimal.ROUND_HALF_UP);
	}
	
	/**
	 * 两数相加
	 * @author cui
	 * @param num1
	 * @param num2
	 * @return
	 */
	public static BigDecimal add(BigDecimal num1, BigDecimal num2){
		if(num1 == null) {
			num1 = new BigDecimal(0);
		}
		if(num2 == null) {
			num2 = new BigDecimal(0);
		}
		return num1.add(num2);
	}
	
	/**
	 * 除法四舍五入保留scale位小数
	 * @author cui
	 * @param num1
	 * @param num2
	 * @param scale
	 * @return
	 */
	public static BigDecimal divide(BigDecimal num1, BigDecimal num2, Integer scale) {
		if(num1 == null) {
			num1 = new BigDecimal(0);
		}
		if(num2 == null) {
			num2 = new BigDecimal(0);
		}
		return num1.divide(num2, scale, BigDecimal.ROUND_HALF_UP);
	}
	
	/**
	 * 除法根据roundingMode保留scale位小数<br>
	 * roundingMode：
	 * BigDecimal.ROUND_DOWN 直接删除多余的小数位，如2.35会变成2.3<br>
	 * BigDecimal.ROUND_UP 进位处理，2.35变成2.4<br>
	 * BigDecimal.ROUND_HALF_UP 四舍五入，2.35变成2.4<br>
	 * BigDecimal.ROUND_HALF_DOWN 四舍五入，2.35变成2.3，如果是5则向下舍<br>
	 * @author cui
	 * @param num1
	 * @param num2
	 * @param scale
	 * @param roundingMode
	 * @return
	 */
	public static BigDecimal divide(BigDecimal num1, BigDecimal num2, Integer scale, Integer roundingMode) {
		if(num1 == null) {
			num1 = new BigDecimal(0);
		}
		if(num2 == null) {
			num2 = new BigDecimal(0);
		}
		return num1.divide(num2, scale, roundingMode);
	}
}
